package cn.jtfadmin.base.filesystem.config;

import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.nio.file.Path;
import java.util.List;

public interface FileSystem {

    /**
     * 复制本地文件后删除本地文件文件
     *
     * @param source   本地源文件
     * @param fileType 复制到的文件类型
     * @return 文件相对url
     */
    String copyFileAndDelSource(Path source, String fileType);

    /**
     * 上传spring web文件
     *
     * @param file 文件
     * @param type 文件类型
     * @return 文件名
     */
    default String upload(MultipartFile file, String type){
        return upload(file, type, true);
    }

    /**
     * 上传spring web文件
     *
     * @param file 文件
     * @param type 文件类型
     * @param updateFileName 是否修改文件名
     * @return 文件名
     */
    String upload(MultipartFile file, String type, boolean updateFileName);

    /**
     * 上传文件
     *
     * @param is   输入流
     * @param type 文件类型
     * @param ext  文件后缀
     * @return 文件名
     */
    String upload(InputStream is, String type, String ext);

    /**
     * 上传文件
     * @param type  文件类型
     * @param is   输入流
     * @param fileName  文件名称
     * @return 文件名
     */
    String upload(String type, InputStream is,  String fileName);

    /**
     * 上传文件
     * @param path 文件路径及文件名
     * @param is 输入刘
     * @return
     */
    String upload(String path, InputStream is);


    /**
     * 获取文件类型要求的后缀
     *
     * @param type 文件类型
     * @return
     */
    List<String> getTypeSuffix(String type);

    /**
     * 验证文件类型是否存在
     *
     * @param type 文件类型
     * @return boolean
     */
    boolean validType(String type);

    /**
     * 获取文件访问的httpUrl
     *
     * @param url url
     * @return 获取文件访问的httpUrl
     */
    String getFileVisitHttpUrl(String url);

    /**
     * 获取文件输入
     *
     * @param fileRelativeUrl 文件相对路径
     * @return 如果文件不存在返回null
     */
    InputStream getFileInputStream(String fileRelativeUrl);


    /**
     * 获取文件长度
     *
     * @param fileRelativeUrl 文件相对路径
     * @return 如果文件不存在返回 -1
     */
    long getFileLength(String fileRelativeUrl);

    /**
     * 文件名称
     * @param fileRelativeUrl 文件相对url
     * @return 文件名
     */
    String getFileName(String fileRelativeUrl);
}
